﻿#define _CRT_SECURE_NO_WARNINGS 1

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型
     */
    int res = INT_MIN;
    int dfs(TreeNode* root)
    {
        if (root == nullptr)
            return 0;

        int l = max(0, dfs(root->left));//左子树的最大单链和，小于0就抛弃
        int r = max(0, dfs(root->right));//右子树的最大单链和，小于0就抛弃

        res = max(res, l + r + root->val);//更新包含当前根结点的路径

        return max(l, r) + root->val;//返回包含根结点的最大单链
    }
    int maxPathSum(TreeNode* root)
    {
        dfs(root);
        return res;
    }
};

/*
二叉树里面的路径被定义为:从该树的任意节点出发，经过父=>子或者子=>父的连接，达到任意节点的序列。
注意:
1.同一个节点在一条二叉树路径里中最多出现一次
2.一条路径至少包含一个节点，且不一定经过根节点
给定一个二叉树的根节点root，请你计算它的最大路径和

例如：
给出以下的二叉树，
最优路径是:2=>1=>3，或者3=>1=>2，最大路径和=2+1+3=6
数据范围：节点数满足1≤n≤10^5，节点上的值满足∣val∣≤1000
要求：空间复杂度O(1)，时间复杂度O(n)

示例1
输入：
{1,2,3}
返回值：
6
*/

